#include "WardPlane.h"
#include <stdio.h>

Couleur WardPlane::calcul(Rayon & rayon, Intersection & intersect, Lumiere &lumiere, Point &observateur){
	Couleur couleurFinale;
	Vecteur normaleIntersect = intersect.getNormale();
	Point pointIntersect = intersect.getPoint();
	Vecteur L (pointIntersect, lumiere.getPoint());
	L.normaliser();
	
	double finalFactor = getDiffusePart();
	double spec = getSpecularPart(rayon, intersect, lumiere, observateur);
	finalFactor += spec;

	couleurFinale = lumiere.getCouleur() * (couleurD * normaleIntersect.prodScal(L) + couleurS * fabs(finalFactor));

	couleurFinale.valider();

	return couleurFinale;
}

double WardPlane::getDiffusePart() {
	return ((rhoD / M_PI));
}

double WardPlane::getSpecularPart(Rayon & rayon, Intersection & intersect, Lumiere &lumiere, Point &observateur) {
	Vecteur N = intersect.getNormale();
	Point pointIntersect = intersect.getPoint();

	// vecteur lumiere
	Vecteur L (pointIntersect, lumiere.getPoint());
	L.normaliser();

	// vecteur vue
	Vecteur V(pointIntersect, observateur);
	V.normaliser();

	// Vecteurs X et Y :
	Vecteur Y = N.prodVect(X);
	Y.normaliser();

	X = Y.prodVect(N);
	X.normaliser();

	// vecteur half
	Vecteur H = (L + V);
	H.normaliser();

	double HdotN = H.prodScal(N);

	double HdotXoverAX = H.prodScal(X) / rugositeX;
	double HdotYoverAY = H.prodScal(Y) / rugositeY;
	
	double expPart = exp( -( ((HdotXoverAX * HdotXoverAX) + (HdotYoverAY * HdotYoverAY)) / (HdotN * HdotN) ) );
	
	double VdotN = V.prodScal(N);
	double LdotN = L.prodScal(N);
	return ((rhoS / (sqrt(abs(VdotN * LdotN)) * (4 * M_PI * rugositeX * rugositeY))) * expPart );
}
